import {takeEvery,takeLatest,take,fork,call,put} from 'redux-saga/effects'
import {INCREMENT_ASYNC} from '../constant'
import {increamentAction} from '../action/actionCounter'


//worker : 工作saga
function* increamentAsync (){
    console.log('worker-increamentAsync');

    //模拟异步操作
    const delay  = (ms)=>new Promise(resolve=>setTimeout(resolve,ms))
    yield delay(3000)

    console.log('worker-异步执行完毕');

    //03)put : 类似dispatch 功能 同步派发action=>reducer
    yield put(increamentAction())
}

//watcher : 监听saga
export function* watchCountSaga(){
    console.log('watchCountSaga');

    //01)taskEvery参数是监听拦截action的类型
    //验证：点击多次异步按钮 都会拦截=>都会执行increamentAsync ；每个increamentAsync都是独立
    // yield takeEvery(INCREMENT_ASYNC,increamentAsync)

    //02)takeLatest 参数是监听拦截action的类型
    //验证：点击多次异步按钮 都会拦截=>都会执行increamentAsync ；=>只会执行最后一个任务 
    //如果之前已经有任务 之前任务就自动取消；
    //避免重复提交 避免并发请求
    // yield takeLatest(INCREMENT_ASYNC,increamentAsync)

    while(true){
        // 监听特定的action , 直到遇到匹配的action 才会阻塞执行take;
        // 执行完毕 才会执行后面代码
        yield take(INCREMENT_ASYNC)
        console.log('after----take-----');
        //fork调用其他函数 ： 非阻塞函数 ，不会等待increamentAsync 函数执行返回结果；直接执行后面语句
        // yield fork(increamentAsync)
        // console.log('after----fork ---- ');

        //call调用其他函数 ：阻塞函数，等待increamentAsync 执行完毕之后 才会执行后面代码
        yield call(increamentAsync)
        console.log('after----call ---- ');
    }

}